package com.wgy.day33其他增强流.序列化流和反序列化流;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * Created by pc on 2020/12/8 0:16
 * Description: LearningJava
 */
/*
java.io.ObjectInputStream extends InputStream
ObjectInputStream:对象的反序列化流
作用:把文件中保存的对象,以流的方式读取出来使用

构造方法:
   ObjectInputStream(InputStream out):创建写入指定InputStream的ObjectInputStream.
特有的成员方法:
   Object readObject():从ObjectInputStream读取对象并返回

使用步骤:
1.创建ObjectInputStream对象,构造方法中传递字节输入流
2.使用ObjectInputStream对象中的方法readObject方法读取保存对象的文件
3.释放资源
4.使用读取出来的对象(打印)

readObject()方法声明抛出了ClassNotFoundException(文件找不到异常),
当不存在对象的class文件时,抛出此异常

序列化和反序列化原理:
1.编译器会把Person.java文件编译生成Person.class文件
2.Person实现了Serializable接口,就会根据类的定义给Person.class文件添加一个序列号
3.存储Person类对象,对Person类进行序列化生成Person.txt文件,它的序列号和Person.class文件序列号一致.
4.反序列化的时候,比较Person.txt的序列号和Person.class文件序列号是否一致
5.如果一致,则反序列化成功.如果不一致,则会抛出序列化冲突异常:InvalidClassException

注意事项:如果修改了类的内容,那么Person.class文件就会获取一个新的序列号,和Person.txt的序列号就不一致了
       这个时候,如果直接进行反序列化就会抛出序列化冲突异常:InvalidClassException
       所以如果修改了类的内容,就一定先对类的对象序列化,然后再反序列化

       对于jvm可以反序列化对象,它必须是能够找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,
       抛出一个序列化冲突异常:InvalidClassException,发生这个异常的原因如下
       1.该类的序列版本号从流中读取的类描述符的版本号不匹配
       2.该类包含未知数据类型
       3.该类没有可访问的无参数构造方法

反序列化的前提:
1.类必须实现Serializable接口
2.必须存在类对应的class文件
3.Person.class文件和person.txt文件的序列号必须是一致的才会反序列化成功

*/
public class Demo02ObjectInputStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.创建ObjectInputStream对象,构造方法中传递字节输入流
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\小云\\abc\\person.txt"));
        //2.使用ObjectInputStream对象中的方法readObject方法读取保存对象的文件
        Object o = ois.readObject();
        //3.释放资源
        ois.close();
        //4.使用读取出来的对象(打印)
        System.out.println(o);
        Person p=(Person)o;
        System.out.println(((Person) o).getName()+((Person) o).getAge());



    }
}
